/**
 * 类型注解 / 类型推断
 * 接口 interface / type alias / 泛型
 * 凡是别人传给我的，都要注解
 * 凡是自己定义的，可以推断，也可以注解
 */

// 1. 基本数据类型
// 2. 引用数据类型
// - 函数
// - 类
// - 泛型
// - 枚举
// - 模块
// - 命名空间
// - 装饰器

// ts文件中引入第三方模块
// 没有被ts书写
// import style from 'styled-components'

// const a = style.num(1, 2)
// console.log(a, 'a')

/**
 *
 * 译者: any 和 unknown 的最大区别是, unknown 是 top type (任何类型都是它的 subtype) ,
 * 而 any 即是 top type, 又是 bottom type (它是任何类型的 subtype ) ,
 * 这导致 any 基本上就是放弃了任何类型检查.
 *
 */

// type {}

// 接口
import styled from 'styled-components'
// type alias
import { CreateDataResponseType, DataItemTypeStr, ObjectType } from './types/main.d'

// 泛型 主要用于引用类型
function createData(): Promise<CreateDataResponseType<DataItemTypeStr>> {
  return new Promise((resolve, reject) => {
    resolve({
      code: 0,
      msg: 'sussess',
      // data: [{ id: 1 }, { id: '2' }],
      // data: { username: 'devin', password: '123', token: 123 },
      data: 'token',
    })
  })
}
const fetchData = async () => {
  const res = await createData()
}
fetchData()

// ---------------------------------------------
// 函数参数的的一个反转 ，返回
function reverseFunc<T, U>(params: [T, U]): [U, T] {
  return [params[1], params[0]]
}

reverseFunc<number, number>([1, 2])
reverseFunc<number, string>([1, '2'])
reverseFunc<number, boolean>([1, true])

// -------------------------------------------

// 给对象添加统一注解,可能没有提示了

const obj: ObjectType = {
  name: 'devin',
  id: 0,
  code: 0,
  msg: 'success',
  bool: true,
  data: [],
}

console.log(obj.name)

// class 中使用泛型-----------------------------------------------

class Person<T> {
  name: T
  constructor(props: T) {
    this.name = props
  }
}

let p = new Person<string>('devin')
